package modeladesktop.gui;
import javax.swing.*;
import javax.swing.table.*;
import modeladesktop.graficas.*;
import java.awt.event.*;
import java.awt.*;
import java.text.*;

public class PanelAnalisis extends JPanel implements ActionListener{
	private ModeloCoeficiente modelo = null;
	private JTable coeficientes = null;
	private JTable matrizCorr = null;
	private Object vars [] = null;
	private JPanel panelCoef = new JPanel();
	private JPanel panelAnova = new JPanel();
	private JPanel panelMatCorr = new JPanel();
	private JPanel datitos = new JPanel();
	private JTable anova = null;
	private ModeloANOVA modeloAno = null;
	private JLabel coefCorrL = new JLabel("Coeficiente de correlacion");
	private JTextField coefCorrTF = new JTextField();
	private JLabel coefDetL = new JLabel("Coeficiente de determinacion");
	private JTextField coefDetTF = new JTextField();
	private JLabel equalL = new JLabel("Ecuacion de correlacion");
	private JTextField equalTF = new JTextField();
	private JButton graficar = new JButton("Graficar");
	private Analisis data = null;

	public PanelAnalisis(Object [] vars, Analisis data){
		this.data = data;
		setLayout(null);
		datitos.setLayout(null);
		this.vars = vars;
		modelo = new ModeloCoeficiente(vars, data.analisisRegresion);
		coeficientes = new JTable(modelo);
		modeloAno = new ModeloANOVA(data);
		anova = new JTable(modeloAno);
		matrizCorr = new JTable(data.matrizCorrelacion, vars);
		JScrollPane scroll = new JScrollPane(coeficientes);
		JScrollPane scrollAno = new JScrollPane(anova);
		JScrollPane scrollMat = new JScrollPane(matrizCorr);
		panelCoef.setBorder(BorderFactory.createTitledBorder("Analisis de coeficientes"));
		panelAnova.setBorder(BorderFactory.createTitledBorder("Analisis ANOVA"));
		panelMatCorr.setBorder(BorderFactory.createTitledBorder("Matriz de correlacion"));
		datitos.setBorder(BorderFactory.createTitledBorder("Datos"));
		panelCoef.setLayout(new BorderLayout());
		panelAnova.setLayout(new BorderLayout());
		panelMatCorr.setLayout(new BorderLayout());

		graficar.addActionListener(this);

		panelCoef.add(scroll, BorderLayout.CENTER);
		panelCoef.add(graficar, BorderLayout.SOUTH);
		panelAnova.add(scrollAno, BorderLayout.CENTER);
		panelMatCorr.add(scrollMat, BorderLayout.CENTER);

		coefCorrL.setBounds(10, 30, 200, 20);
		coefCorrTF.setBounds(10, 40, 150, 25);
		coefDetL.setBounds(10, 70, 200, 20);
		coefDetTF.setBounds(10, 100, 150, 25);
		equalL.setBounds(10, 120, 200, 20);
		equalTF.setBounds(10, 150, 300, 25);

		datitos.add(coefCorrL);
		datitos.add(coefCorrTF);
		datitos.add(coefDetL);
		datitos.add(coefDetTF);
		datitos.add(equalL);
		datitos.add(equalTF);
		DecimalFormat df = new DecimalFormat("0.000"); 
		coefCorrTF.setText(df.format(data.coefDeterminacion)+"");
		coefDetTF.setText(df.format(data.errorEstandarEstimacion)+"");
		String ecuacion = data.dependiente + " = ";
		for(int i = 0; i < data.analisisRegresion.length; i++){
			if(i == 0)
				ecuacion += df.format(data.analisisRegresion[i][0]);
			else if(i > 0)
				ecuacion += " + ("+ df.format(data.analisisRegresion[i][0])+")("+vars[i]+")";
		}
		equalTF.setText(ecuacion);

		panelCoef.setBounds(20, 20, 400, 300);
		panelAnova.setBounds(20, 340, 600, 150);
		panelMatCorr.setBounds(430, 20, 400, 300);
		datitos.setBounds(20, 500, 350, 300);
		add(panelCoef);
		add(panelAnova);
		add(panelMatCorr);
		add(datitos);
	}

	public void actionPerformed(ActionEvent ev){
		if(ev.getSource() == graficar){
			Grafico graph = new Grafico();
			graph.graficaPuntosF(data.K, data.N-data.K-1, 1.5, 2.5, "");
		}
	}
}

class Resultados extends JFrame{
	public JTextArea area = new JTextArea();
	public JPanel pan = new JPanel();
	public Resultados(Analisis analisis){
		pan.setLayout(new BorderLayout());
		pan.add(area, BorderLayout.CENTER);
		concluir(analisis);
		setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		setSize(500, 500);
		setVisible(true);
	}

	public void concluir(Analisis analisis){
		String conclusion = "";
		if(analisis.coefDeterminacion >= 0.8)
			conclusion += "Los datos se ajustan muy bien al modelo\n\n";
		else if(analisis.coefDeterminacion < 0.8 && analisis.coefDeterminacion > 0.6)
			conclusion += "El ajuste del modelo es bajo, pero aceptable\n\n";
		else if(analisis.coefDeterminacion <= 0.6 && analisis.coefDeterminacion > 0.4)
			conclusion += "El ajuste del modelo es bajo, pero no se recomienda usar el modelo\n\n";
		else if(analisis.coefDeterminacion <= 0.4 && analisis.coefDeterminacion > 0)
			conclusion += "El ajuste del modelo es demaciado bajo, no se debe usar el modelo\n\n";

		if(analisis.errorEstandarEstimacion < 0.2)
			conclusion += "El error de estimacion es bajo, la dispersion de los datos es baja\n\n";
		else if(analisis.errorEstandarEstimacion >= 0.2 && analisis.errorEstandarEstimacion < 0.4)
			conclusion += "El error es aceptable, la dispersion de los datos no es muy alta\n\n";
		else if(analisis.errorEstandarEstimacion >= 0.4 && analisis.errorEstandarEstimacion < 0.6)
			conclusion += "El error del modelo es alto, no es recomendable usar el modelo\n\n";
		else if(analisis.errorEstandarEstimacion >= 0.6)
			conclusion += "El ajuste del modelo es demaciado alto, no se debe usar el modelo\n\n";
		area.setText(conclusion);
	}
}

class ModeloANOVA extends AbstractTableModel{
	private final String[] anovaCab = {"Fuente", "Grados de libertad", "Suma de cuadrados", "Cuadrado Medio", "F", "P"};
	private final String[] colAtr = {"Regresion", "Residual", "Total"};
	private Double [][] data = new Double[3][5];

	public ModeloANOVA(Analisis datos){
		data[0][0] = (double)datos.K;
		data[1][0] = (double)datos.N - (double)datos.K - 1.0;
		data[2][0] = (double)datos.N - 1.0;
		data[0][1] = datos.scr;
		data[1][1] = datos.sce;
		data[2][1] = datos.sct;
		data[0][2] = datos.scr/(double)datos.N;
		data[1][2] = datos.sce/((double)datos.N - (double)datos.K - 1.0);
		data[0][3] = datos.se/datos.sb1;
		data[0][4] = 0.0;
	}

	@Override
	public Object getValueAt(int row, int col){
		if(col == 0)
			return colAtr[row];
		return data[row][col-1];
	}

	@Override
	public void setValueAt(Object value, int row, int col){
		if(col > 0){
			if(value == null)
				data[row][col-1] = null;
			else
				data[row][col-1] = Double.parseDouble(value.toString());
		}
	}

	@Override
	public Class getColumnClass(int col){
		if(col == 0)
			return String.class;
		return Double.class;
	}

	@Override
	public boolean isCellEditable(int row, int col){
		if(col == 0)
			return false;
		return true;
	}

	@Override
	public String getColumnName(int col){
		return anovaCab[col];
	}

	@Override
	public int getColumnCount(){
		return 6;
	}

	@Override
	public int getRowCount(){
		return 3;
	}
}
